Estoy trabajando en una aplicación Express con MongoDB e intento utilizar FeathersJS para todos mis servicios. Aquí estoy ejecutando una prueba para enviar un mensaje de error del servidor al cliente, pero tengo un problema con la respuesta del controlador de errores. Mis encabezados de requisitos tienen las cosas correctas de la application/json , por lo que asumí que el controlador de errores debería devolver el json válido.
Sé que no estoy usando la siguiente devolución de llamada en mi función, pero cuando intento hacerlo, aparece el mismo error, así que creo que tiene que ver con el controlador de errores. ¡Cualquier dirección aquí sería muy apreciada!
El primer registro de errores está en el servidor, lo cual es correcto.
Bucket Services error >>>>> Bucket validation failed Possibly Unhandled Rejection: Bucket validation failed, Promise { <rejected> 'Bucket validation failed' } >>>>>> Error: Unexpected token < in JSON at position 0 at convert (/Users/jaruesink/Documents/Projects/Buckets/node_modules/feathers-rest/node_modules/feathers-errors/lib/index.js:365:79) at toError (/Users/jaruesink/Documents/Projects/Buckets/node_modules/feathers-rest/lib/client/base.js:24:37) at process._tickCallback (internal/process/next_tick.js:103:7)mi función de creación dentro de la clase BucketService:
create({ amount, isFund = false, name, type, userID: owner }, params, next) { const new_bucket = new Bucket({ name, amount, type, isFund, owner }); return new_bucket.save((error) => { console.log('error >>>>>', error.message); if (error) { return Promise.reject(error.message); } return Promise.resolve(new_bucket); }); }mi archivo de enrutador:
const feathers = require('feathers'); const errorHandler = require('feathers-errors/handler'); const rest = require('feathers-rest'); const router = feathers(); const LoginService = require('../services/login_service'); const UserService = require('../services/user_service'); const BucketService = require('../services/bucket_service'); // Enable REST services router.configure(rest()); router.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); next(); }); router.use('/login', new LoginService()); router.use('/user', new UserService()); router.use('/bucket', new BucketService()); // Set up error handling router.use(errorHandler()); module.exports = router;Lo descubrí, la clave era pasar correctamente a través de una función de devolución de llamada (siguiente) como el tercer parámetro para manejar los errores. FeathersJS maneja los rechazos de promesas por usted en caso de errores. Luego, en mi prueba, necesitaba convertir Feathers-Error a JSON antes de poder recibir el mensaje.
Cambié mi prueba a:
it('can validate an incorrect bucket', (done) => { const invalid_bucket = { name: 'Invalid Bucket', }; bucket_service.create(invalid_bucket, {}, (error) => { error = error.toJSON(); assert(error.message.length > 0); done(); }); });y mi función de creación para:
create({ amount, isFund = false, name, type, userID: owner }, params, next) { const new_bucket = new Bucket({ name, amount, type, isFund, owner }); return new_bucket.save() .then(created_bucket => Promise.resolve(created_bucket)) .catch(next); }